home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
TPUG - Toronto PET Users Group
/
TPUG Users Group CD
/
TPUG Users Group CD.iso
/
CRS
/
crs47.d81
/
cbmhck4a.sfx
/
cbmhack.4-1
next >
Wrap
Text File
|
1990-02-12
|
45KB
|
971 lines
10121
┴RTICLE #10121 (10178 IS LAST):
╞ROM: DUCK@PEMBVAX1.PEMBROKE.EDU
╬EWSGROUPS: COMP.SYS.CBM
╙UBJECT: ├= ╚ACKING #4 1/5
─ATE: ═ON ╧CT 5 09:56:02 1992
########
##################
###### ######
#####
##### #### #### ## ##### #### #### #### #### #### #####
##### ## ## #### ## ## ## ### ## #### ## ## ##
##### ######## ## ## ## ##### ## ## ## ## ##
##### ## ## ######## ## ## ## ### ## ## #### ## ##
##### #### #### #### #### ##### #### #### #### #### #### ######
##### ##
###### ###### ╓OLUME 1, ╔SSUE #4
################## ╧CTOBER 5, 1992
########
-----------------------------------------------------------------------------
┼DITOR'S ╬OTES:
BY ├RAIG ╘AYLOR (DUCK@PEMBVAX1.PEMBROKE.EDU)
═Y APOLOGIES ABOUT THIS ISSUE BEING POSTED LATER THAN WAS MENTIONED IN A
PREVIEW POST ON COMP.SYS.CBM NEWSGROUP. ─UE TO SOME PROBLEMS WITH CODING,
SCHOOL AND ═URPHY'S LAW THE ISSUE HAD TO BE DELAYED UNTIL NOW.
╔ HAVE ASKED THE SYSTEM ADMIN'S AT MY SITE CONCERNING A MAIL-SERVER BUT THEY
SAID THEY DID NOT HAVE ENOUGH MAN-POWER (GO FIGURE) TO GET SOMEBODY TO RUN IT.
╔ WILL BE IMPLEMENTING A MAIL-SERVER SYSTEM IN MY ACCOUNT IN THE NEAR
FUTURE FOR RETRIEVAL OF PROGRAMS AND BACK-ISSUES. ╔'LL POST DESCRIPTIONS OF
HOW TO USE IT IT THE NEXT ISSUE OF ├= ╚ACKING AS WELL AS ON THE NEWSGROUP
COMP.SYS.CBM WHEN ╔ FINISH WRITING IT.
╔N THIS ISSUE OF ├= ╚ACKING WE ALSO START ON AN AMBITIOUS TASK: ─EVELOPING
A GAME FOR BOTH THE ├128 AND ├64 MODES THAT INCLUDES ALL OF THE FEATURES
FOUND IN COMMERCIAL GAMES. ╘AKE A LOOK IN THE ╠EARNING ═╠ ├OLUMN FOR MORE
INFORMATION.
┴LSO, ╘HE ARTICLE CONCERNING THE 1351 MOUSE HAS _AGAIN_ BEEN DELAYED DUE
TO TIME CONSTRAINTS. ╥EST ASSURED THAT IT WILL BE IN THE NEXT ISSUE OF
├= ╚ACKING.
╔F YOU ARE INTERESTED IN HELPING WRITE FOR ├= ╚ACKING PLEASE FEEL FREE TO
MAIL DUCK@PEMBVAX1.PEMBROKE.EDU (OR DUCK@HANDY.PEMBROKE.EDU). ╫E'RE ALWAYS
LOOKING FOR NEW AUTHORS ON ALMOST ANY SUBJECT, SOFTWARE OR HARDWARE.
================================================================================
┴LSO NOTE THAT THIS ISSUE AND PRIOR ONES ARE AVAILABLE VIA ANONYMOUS FTP FROM
CCOSUN.CALTECH.EDU UNDER PUB/RKNOP/╚┴├╦╔╬╟.═┴╟.
================================================================================
╬╧╘╔├┼: ╨ERMISSION IS GRANTED TO RE-DISTRIBUTE THIS "NET-MAGAZINE", IN
WHOLE, FREELY FOR NON-PROFIT USE. ╚OWEVER, PLEASE CONTACT INDIVIDUAL
AUTHORS FOR PERMISSION TO PUBLISH OR RE-DISTRIBUTE ARTICLES SEPERATELY.
*** ┴╒╘╚╧╥╙ ╠╔╙╘┼─ ┬┼╠╧╫ ╥┼╘┴╔╬ ┴╠╠ ╥╔╟╚╘╙ ╘╧ ╘╚┼╔╥ ┴╥╘╔├╠┼╙ ***
================================================================================
╔N THIS ISSUE:
╠EARNING ═╠ - ╨ART 4
╔N THE NEXT ISSUE WE'LL EMBARK ON A PROJECT OF MAKING A SPACE INVADERS STYLE
GAME FOR THE ├=64/128 FROM SCRATCH USING CUSTOM CHARACTERS, INTERRUPT-DRIVEN
MUSIC, ANIMATION, USING THE JOYSTICK, MOUSE OR KEYBOARD. ╘HE ├64 AND ├128
VERSIONS WILL BE DEVELOPED CON-CURRENTLY, EACH PROGRAM TAKING ADVANTAGE OF
THE MACHINE'S CAPABILITIES. ╘HIS IS THE FIRST IN A SERIES - WRITTEN BY
├RAIG ╘AYLOR.
╘HE ─EMO ├ORNER: ╞╠╔ - MORE COLOR TO THE SCREEN
┴LL OF US HAVE HEARD COMPLAINTS ABOUT THE COLOR CONSTRAINTS ON ├64.
╞╠╔ PICTURE CAN HAVE ALL OF THE 16 COLORS IN ONE CHARACTER POSITION.
╫HAT THEN IS THIS ╞╠╔ AND HOW IT IS DONE ? ╫RITTEN BY ╨ASI '┴LBERT' ╧JALA.
╥╙-232 ├ONVERTER
╘HIS ARTICLE DETAILS PLAN FOR A ╒SER PORT ╘╧ ╥╙232 CONNECTOR USING JUST ╧╬┼
╔├ AND 4 CAPACITORS. ╘HE CIRCUIT IS INCLUDED, AND SUGGESTIONS ON ALTERNATIVE
CHIPS AND PARTS ARE EXAMINED. ╫RITTEN BY ╫ARREN ╘USTIN
╔NTRODUCTION TO THE ╓╔├-╔╔
╘HIS ARTICLE EXAMINES THE ╓╔├-╔╔ CHIP IN DETAIL AND PROVIDES AN EXPLANATION
OF THE VARIOUS REGISTERS ASSOCIATED WITH THE CHIP. ╫RITTEN BY ╨ASI '┴LBERT'
╧JALA.
╠╔╘╘╠┼ ╥┼─ ╥┼┴─┼╥: ═╙-─╧╙ FILE READER FOR THE 128 AND 1571/81 DRIVES.
╘HIS ARTICLE PRESENTS A PROGRAM THAT READS ═╙-─╧╙ FILES AND THE ROOT DIRECTORY
OF ═╙-─╧╙ DISKS. ╘HIS PROGRAM COPIES FILES FROM DISK TO DISK SO TWO DISK
DRIVES ARE REQUIRED TO USE IT (OR A "VIRTUAL" DRIVE). ╘HIS SCHEME IMPOSES NO
LIMIT ON THE MAXIMUM SIZE OF A FILE TO BE TRANSFERRED. ╘HE USER-INTERFACE
CODE IS WRITTEN IN ┬┴╙╔├ AND PRESENTS A FULL-SCREEN FILE SELECTION MENU. ╘HE
GRUNT-WORK CODE IS WRITTEN IN ASSEMBLY LANGUAGE AND OPERATES AT MAXIMUM
VELOSITY. ├OMPLETE, EXPLAINED CODE LISITINGS ARE INCLUDED. ┬Y ├RAIG ┬RUCE.
=============================================================================
╠EARNING ═ACHINE ╠ANGUAGE - ╨ART 4
BY ├RAIG ╘AYLOR (DUCK@PEMBVAX1.PEMBROKE.EDU)
+---------------------------+
ⁿ ╙PACE ╔NVASION - ╨ART 1 ⁿ
ⁿ ⁿ
ⁿ ╨ROGRAMMING: ├RAIG ╘AYLOR ⁿ
ⁿ ╟RAPHICS : ╨ASI ╧JALA ⁿ
ⁿ ═USIC/╙OUND: ⁿ
ⁿ ⁿ
+---------------------------+
╔. ╔NTRODUCTION
------------
╔N THIS AND FUTURE ╠EARNING ═ACHINE ╠ANGUAGE'S WE WILL DEVELOP A GAME CALLED
╙PACE ╔NVASION. ╘HE GAME WILL BE SIMILAIR TO ╙PACE ╔NDVADERS AND WILL RUN ON
THE ├OMMODORE 64 OR THE ├OMMODORE 128 IN 80 COLUMNS. ╔T WILL FEATURE ALL THE
"FEATURES" AND "PARTS" THAT ARE FOUND IN COMMERCIAL GAMES WITH INTERRUPT-
DRIVEN MUSIC, CUSTOM CHARACTER DEFINITIONS, 100% MACHINE LANGUAGE, MULTI-LEVEL
GAME PLAY, AND INPUT FROM THE KEYBOARD, JOYSTICK OR MOUSE.
╬OTE ⁿ ╔ AM LOOKING FOR SOMEONE TO HELP AID MUSIC COMPOSITION THAT WILL
-----+ BE INTRODUCED IN A LATER ISSUE. ╨ROGRAMMING OF THE 6502 IS HELPFUL
BUT NOT A REQUIREMENT. ╨LEASE EMAIL ME AT DUCK@PEMBVAX1.PEMBROKE.EDU IF
YOU ARE INTERESTED.
═ANY THANKS TO ╨ASI ╧JALA FOR HIS WORK WITH THE GRAPHICS IN THIS PROGRAM.
┴LSO PLEASE NOTE: ╘HIS ENTIRE PROGRAM HAS BEEN ASSEMBLED SUCESSFULLY WITH
THE ┬UDDY-128 ASSEMBLER FOR BOTH THE ├=128 AND ├=64 VERSION. ─UE TO THE
LENGTH OF THE SOURCE FILES (OVER 1,500 LINES) ╔'M NOT SURE IF ┬UDDY-64 WILL
HANDLE IT. ╘HUS IF YOU GET ERRORS DURING ASSEMBLY, ALL ╔ CAN SAY IS: SORRY.
╔F THIS IS THE CASE THEN THE NEXT ISSUE WILL HANDLE DIVIDING THE PROGRAM AND
DATA UP INTO SEGMENTS WHICH CAN THEN EACH BE LOADED SEPERATLY.
╔╔. ═ACHINE ╬OTES
-------------
╘HE ├OMMODORE 64 AND 128 PROGRAMS FOR ╙PACE ╔NVASION WILL DIFFER SLIGHTLY,
MOSTLY IN THE FOLLOWING AREAS:
- CUSTOM CHARACTER DEFINITION
- MEMORY INITIALIZATION / SETUP
- SOUND / MUSIC
┬ECAUSE THE ACTUAL GAME PLAY AND THE CHANGES NESSCESARY BETWEEN THE AREAS
LISTED ABOVE, WE WILL USE THE ┬UDDY ┴SSEMBLER NOTATION FOR CONDITIONAL
ASSEMBLY TO ALLOW THE DEVELOPMENT OF ONLY ONE FILE CONTAINING THE SOURCE
CODE. ╔N ADDITION TO CONDITIONAL ASSEMBLY MOST OF THE ROUTINES WILL BE
WRITTEN AS ONE WITH JUMPS TO SUBROUTINES CONTAINING THE ├64 OR 128 DIRECT
CODE AS THE ALGORITHIMS ARE USUALLY THE SAME FOR EACH.
╔N ADDATION THERE WILL BE SEVERAL SOURCE FILES AND SOME MISCELLANEOUS INCLUDE
FILES FOR GRAPHICS AND SOUND. ╞OR THOSE OF YOU WHO ARE OR WILL BE CONVERTING
THE ASSEMBLY SOURCE OVER TO A DIFFERENT ASSEMBLER THE CONDITIONAL
ASSEMBLY DIRECTIVES .IF (CONDITION) WILL ONLY BE TRUE IF THE CONDITION IS
NON-ZERO. ╔E: IF THE SYMBOL COMPUTER IS DEFINED AS 128 THEN THE FOLLOWING
EXAMPLE ILLUSTRATES IT:
COMPUTER = 128
.IF COMPUTER-64 ; NON-ZERO ANSWER SO THEREFORE
; 128 CODE GOES HERE
.ELSE
; 64 CODE GOES HERE
.IFE ; END THE .IF CONDITION.
┴LSO NOTE THAT FOR MUCH OF THE PROGRAM WE WILL _NOT_ BE USING THE COMPUTER
ROUTINES AND INSTEAD BE DEVELOPING OUR OWN.
╔N ADDITION THE PROGRAM WILL SHOW YOU HOW TO USE ╔╥╤ INTERRUPTS TO SIMPLIFY
PROGRAMMING. ╫E WILL BE USING THEM TO PLAY MUSIC IN THE BACKGROUND ON THREE
VOICES (SOUND EFFECTS WILL TEMPORARILY PRE-EMPT THE THIRD VOICE FROM PLAYING).
┴LSO ANIMATION OF CHARACTERS WILL BE DONE VIA THE ╔╥╤. ┴ LITTLE BACKGROUND
ON INTERRUPTS FOR THOSE OF YOU WHO ARE A BIT HAZY ON WHAT THEY ARE OR HAVE
NEVER SEEN THEM BEFORE (┴LSO TRY TAKING A LOOK AT ╥ASTERS: ╫HAT THEY ARE AND
HOW TO USE THEM IN ├= ╚ACKING #3 - ╫HILE THIS DOES NOT NECESSARILY COVER
WHAT WE ARE GOING TO BE USING INTERRUPTS FOR IT DOES DESCRIBE THEM QUITE
WELL.) ┬ASICALLY THE COMPUTER GENERATES AN INTERRUPT EVERY 1/60TH A SECOND
FROM A TIMER ON THE COMPUTER (USUALLY FROM THE ├╔┴ CHIP OR THE SCREEN FOR
THOSE OF YOU WHO ARE CURIOUS). ╘HE COMPUTER WILL SAVE ALL THE REGISTERS, JUMP
TO A SUBROUTINE - PERFORM THE INSTRUCTIONS THERE (USUALLY UPDATING TIME,
SCANNING THE KEYBOARD ETC...) AND THEN RECALL ALL THE REGISTERS AND RETURN
TO THE USER PROGRAM. ╘HIS IS AN INTERRUPT. ┴N ╔╥╤ INTERRUPT DESCRIBES AN
INTERRUPT THAT WE CAN ALLOW TO BE "TURNED ON" AND "TURNED OFF" - IE: WE
CAN TEMPORARILY DISABLE IT IF WE HAVE TO. ┴ ╬═╔ INTERRUPT DESCRIBES AN
INTERRUPT WHICH WE CAN _NOT_ TEMPORARILY DISABLE -- WE WILL NOT BE USING
╬═╔ INTERRUPTS IN THIS PROGRAM.
╔╔╔. ╘HE ╨ROCESS
-----------
╨ART OF WHAT THIS SERIES OF ARTICLES IS FOCUSED AT IS THE DEVELOPMENT OF BEING
ABLE TO ANALYZE PROGRAMMING TASKS AND BREAK THEM DOWN INTO SMALLER WORKABLE
PROBLEMS. ╧NCE THESE PROBLEMS OR SUBROUTINES ARE COMPLETED YOUR ORIGINAL
PROBLEM IS SOLVED.
╠ET'S TAKE THIS APPROACH TO ╙PACE ╔NVASION:
╨ROBLEM ╙TATEMENT: ┬UILD A ╙PACE ╔NVADER PROGRAM CALLED ╙PACE ╔NVASION.
-----------------
╒SUALLY, GIVEN A PROBLEM YOU HAVE TO RE-WORK THE PROBLEM STATEMENT TO
ENCOMPASS ALL OF WHAT YOU WANT. ╠ET'S TRY AGAIN:
╨ROBLEM ╙TATEMENT: ─EVELOP A ╙PACE ╔NVADER PROGRAM CALLED ╙PACE ╔NVASION
----------------- UTILIZING THE 64 OR 128 SCREEN WITH INTERRUPT DRIVEN
MUSIC / SOUND, AND ALLOWING INPUT FROM THE KEYBOARD,
JOYSTICK OR MOUSE.
╚MMM... ╘HE PROBLEM STATEMENT LISTED ABOVE IS BETTER BUT IT HAS NO REAL ORDER;
WE HAVE NO CLEAR IDEA OF WHERE TO START AND WHAT WE NEED TO DO. ╔T DOES
HOWEVER TELL US THAT WE HAVE THE FOLLOWING SECTIONS:
- 64 / 128 ╙CREEN ╚ANDLING
- ═USIC / ╙OUND
- ╔NPUT ╚ANDLING
- ╟AME ─RIVER (IMPLIED)
╠ET'S THINK A BIT MORE ABOUT EACH OF THESE SECTIONS AND WHAT EACH WILL
INVOLVE:
128 / 64 ╙CREEN ╚ANDLING: - ╨UTTING CHARACTERS ON SCREEN.
------------------------ - ╔NITIALIZING THE ╙CREEN / ╥EGISTERS.
- ╙ETTING UP THE ├USTOM ├HARACTERS.
- ╚ANDLING ANY ┴NIMATION.
═USIC / ╙OUND: - ╙ETTING UP THE ╙OUND ├HIP ╥EGISTERS.
------------- - ╨LAYING A NOTE READ FROM ═EMORY.
- ┼XECUTING A ╙OUND ┼FFECT.
╔NPUT ╚ANDLING: - ─EVICE ╙ELECTION (KEYBOARD, MOUSE, JOYSTICK).
-------------- - ╦EYBOARD ╙CANNING.
- ═OUSE ╙CANNING.
- ╩OYSTICK ╙CANNING.
╟AME ─RIVER: - ╘ITLE ╙CREEN.
----------- - ╔NITIALIZATION OF ═EMORY.
- ╠EVEL ╙ETUP.
- ═OVEMENT OF ┴LIENS.
- ═OVEMENT OF ═ISSLES.
- ═OVEMENT OF ╨LAYER.
- ├OLLISION ├HECKING.
- ├OLLISION ╚ANDLING.
- ┼ND OF ╠EVEL.
- ╙CORE ╒PDATING.
- ┼ND - ╟AME HANDLING.
- ╚IGH ╙CORE ╒PDATE.
╙HREW! ╠ONG LIST 'EH? - ╬OW YOU MAY HAVE THOUGHT OF SOME NOT LISTED ABOVE,
AND WE MAY HAVE POSSIBLY OVERLOOKED SOME CRUCIAL ROUTINES -- THAT'S FINE --
THE ABOVE IS JUST INTENDED AS A BUILDING BLOCK - A PLACE TO START CODING FROM.
╔F WE THINK OF THESE AS SUBROUTINES WE CAN BUILD A SKELETON OUTLINE OF THE
PROGRAM - YET WE NEED SOME ORDER IN HOW WE CALL THEM. ╧BVIOUSLY WE AREN'T
GOING TO MOVE THE PLAYER UNTIL WE SCAN THE INPUT AND THAT REQUIRES PRIOR
DEVICE SELECTION ETC...
╚MM... ╘AKING ORDER INTO ACCOUNT WE CAN RE-STATE THE PROBLEM AS:
╨ROBLEM ╙TATEMENT: ─EVELOP A GAME SIMILAIR TO ╙PACE ╔NVADERS CALLED ╙PACE
----------------- ╔NVASION BY INITIALIZING MEMORY, THE DISPLAY DEVICE,
SETTING UP ├USTOM ├HARACTERS, SETTING UP THE ═USIC
╥EGISTERS AND DISPLAYING THE TITLE SCREEN. ╞ROM THERE,
SELECT THE INPUT DEVICE AND AFTER THAT SETUP THE CURRENT
LEVEL. ╬EXT, WHILE PLAYING MUSIC IN THE BACKGROUND AND
SCANNING THE INPUT DEVICE, MOVE THE ALIENS, MISSLES AND
PLAYER CHECKING FOR COLLISIONS AND TAKING APPROPRIATE
ACTION AS REQUIRED (PLAYER DIES, SCORE INCREASES ETC OR
WHAT-NOT). ┴FTER EACH LEVEL DISPLAY IF THE PLAYER IS DEAD,
OR SET-UP FOR THE NEXT LEVEL AND REPEAT. ╫HEN THE GAME HAS
ENDED UPDATE THE HIGH SCORE IF NECESSARY.
╘RY SAYING THAT FIVE TIMES REAL FAST! :-) ┬UT THAT PROBLEM STATEMENT IS A
WHOLE LOT BETTER THAN THE ONE WE HAD AT THE BEGINNING WHICH SIMPLY SAID TO
DEVELOP A GAME.
╔╓. ╬OT ┴LL ┴T ╧NE ╘IME - ╫HAT ╫E'RE ─OING ╘HIS ╘IME
------------------------------------------------
╬OW THIS PROGRAM IS TOO COMPLEX, (AS SEEN BY THE PROBLEM STATEMENT ABOVE) TO
HAVE IN ONE ARTICLE SO THIS ISSUE WE'LL CONCENTRATE ON THE BASIC MAIN LOOP
AND THE INITIALIZATION OF THE ├USTOM ├HARACTERS AND THE TITLE SCREEN.
╧RIGINALLY, ╔ WAS PLANNING ON UPDATING AND LISTING THE REVISED CODE IN EACH
ISSUE. ╚OWEVER, DUE TO SPACE LIMITATIONS AND THE ENORMITY OF THE PROGRAM
CURRENTLY (1,500+ LINES!!) IT WILL BE PLACED FOR ANONYMOUS FTP AT
CCOSUN.CALTECH.EDU UNDER THE DIRECTORY: PUB/RKNOP/╚┴├╦╔╬╟.═┴╟.
╓. ╘HE ═AIN ╠OOP
-------------
╫HAT IS A MAIN LOOP? ┬ASICALLY IT'S WHERE EVERYTHING GETS DONE. ╔T CALLS OTHER
SUBROUTINES AND KEEPS REPEATING UNTIL CERTAIN CRITERIA ARE MET - USUALLY WHEN
THE PLAYER REQUESTS TO EXIT THE GAME. ╚OWEVER, INSIDE YOU'LL FIND INNER LOOPS
FOR LEVEL PLAY ETC.
╧UR MAIN LOOP FOR THIS PROGRAM WILL BE:
-------------------------------------------------------------------------------
;; * ═AIN ╠OOP - ╘HIS SHOULD BE THE LAST SECTION IN THE SOURCE CODE.
;
; ═AIN ╠OOP
;
MAIN'LOOP = *
JSR MEMORY'SETUP ; ╙ET-╒P MEMORY.
JSR DISPLAY'SETUP ; " " DISPLAY.
JSR CHAR'SETUP ; " " CUSTOM CHARACTER DISPLAY.
JSR MUSIC'SETUP ; " " MUSIC CHIP.
JSR TITLE'SCREEN ; ─ISPLAY THE TITLE SCREEN.
JSR SELECT'INPUT ; ╙ELECT ╔NPUT ─EVICE.
LEVEL'LOOP = *
JSR PLAY'MUSIC ; ╙TART THE MUSIC PLAYING.
JSR SETUP'LEVEL ; ╙ETUP THE CURRENT LEVEL.
- JSR ALIEN'MOVE ; ═OVE ALIENS
JSR MISSLE'MOVE ; " MISSLES
JSR PLAYER'MOVE ; " PLAYER
JSR CHECK'COLLISION ; ├HECK FOR COLLISIONS
LDX COLLISION'FLAG ; ├HECK COLLISION FLAG.
BEQ -
DEX ; ─ECREASE .╪ BY 1 SO IF ╪ WAS 1 THEN
BEQ PLAYER'DIE ; IT'S NOW 0 SO WE KNOW PLAYER DIED.
DEX ; ─ECREASE .╪ AGAIN SO IF ╪ WAS 2 THEN
BEQ ALIEN'DIE'SOUND ; IT'S NOW 0 SO WE MAKE ALIEN DEATH.
JSR END'LEVEL ; ╔F WE GOT HERE - THAN END OF LEVEL.
JSR WAIT'NEXT ; ╫AIT FOR NEXT KEYPRESS.
JSR INCREASE'LEVEL ; INCREASE LEVEL #.
SEC ; ┴ND GO BACK....
BCS LEVEL'LOOP
ALIEN'DIE'SOUND = *
JSR MAKE'ALIEN'SOUND ; MAKE ALIEN SOUND.
SEC ; SET CARRY
BCS - ; AND JUMP BACK.
PLAYER'DIE JSR SHOW'PLAYER'DIE ; ╙HOW IT ON-SCREEN.
LDA LIVES ; ├HECK # OF LIVES.
BEQ END'OF'GAME ; ╔F 0 THE END-OF-GAME.
BNE LEVEL'LOOP ; GO BACK AND RE-START LEVEL.
BRK ; ╔F WE GET HERE - THAN AN ERROR.
END'OF'GAME JSR END'GAME'SCREEN ; ╙HOW END-OF-GAME SCREEN.
JSR HIGH'SCORE'UPDATE ; ╒PDATE THE HIGH SCORE IF NEED-BE.
JSR WAIT'NEXT ; ╫AIT FOR NEXT-GAME SELECTION.
LDA QUIT
BEQ +
JSR SETUP'LEVEL'1 ; ╙ET-╒P FIRST LEVEL.
SEC
BCS LEVEL'LOOP ; AND START PLAYING IT.
+ JMP QUIT'GAME
;
; ┼ND OF ═AIN ╠OOP
;
-------------------------------------------------------------------------------
╙OME OF THE ROUTINES LISTED ABOVE WE WILL LATER REPLACE WITH ACTUAL CODE. ╔T'S
MUCH EASIER TO SEE:
INC LEVEL
THAN TO SEE A
JSR INCREASE'LEVEL
AND TRY TO HUNT DOWN THE CODE. ╔'VE INCLUDED THEM IN FOR NOW SO THAT WE CAN
HAVE A BETTER IDEA OF WHAT IS GOING ON.
╔N THE FILE: INVASION.SRC MOST OF THE STATEMENTS ABOVE ARE COMMENTED OUT.
╧NCE WE WRITE THE ROUTINES WE'LL UN-COMMENT THEM. ╞OR NOW, THIS SERVES TO
STILL REMIND US OF THE ROUTINES WE NEED TO WRITE.
┴LSO THERE ARE A COUPLE OF PROGRAMMING TRICKS THAT ╔ USED IN THE MAIN LOOP
THAT PROBABLY NEED SOME CLARIFYING.
╫HEN HANDLING THE COLLISIONS THE .╪ REGISTER IS LOADED WITH THE RESULT OF THE
COLLISION CHECKING - $00 = NO COLLISIONS, $01 = PLAYER DIED, $02 = ALIEN DIED,
$03 = END OF LEVEL. ┴NYTIME A LOAD TO A REGISTER IS DONE THE FLAGS ARE
AUTOMATICALLY SET AS IF YOU HAD COMPARED IT TO 0 - HENCE WE CAN LDX THE
COLLISION FLAG AND IMMEDIATELY BRANCH IF EQUAL TO ZERO FOR NO COLLISIONS. ╔N
ADDITION TO THE LOAD ANYTIME THE .╪ OR .┘ REGISTERS ARE INCREMENTED OR
DECREMENTED AN IMPLICIT COMPARISON TO ZERO IS PERFORMED. ╙O IF THE .╪ REGISTER
IS 1 PREVIOUSLY, WE DECREMENT IT THEN IT WILL BE ZERO AND OUR ┬┼╤ INSTRUCTION
WILL BRANCH. ╔F IT'S TWO THEN IT WILL BE ONE AND WE CAN CONTINUE LIKE THIS.
[╬╧╘┼: ╘ECHNICALLY IT'S NOT A REAL COMPARISON TO ZERO BUT CALLING IT A
COMPARISON TO ZERO SERVERS OUR PURPOSE HERE. ╘HE ONLY SIGNIFICANT DIFFERENCE
WOULD BE IN THE EFFECT OF THE CARRY FLAG WHICH IS INSIGNIFICANT IN OUR
CODE SEGMENT HERE.]
┴LSO IN SEVERAL LOCATIONS ARE THE TWO INSTRUCTIONS:
SEC
BCS [LABEL]
╫HAT THESE ARE DOING ARE SIMPLY PROGRAMMING STYLE - THEY COULD BE SUBSTITUTED
WITH ╩═╨ [LABEL] - HOWEVER THEY OFFER ADVANTAGES OVER ╩═╨. ╘HEY TAKE UP THE
A LARGER AMOUNT OF EXECUTION TIME, HOWEVER THEY ARE RELOCATABLE SO ANY MUCKING
AROUND / MOVING SECTIONS OF CODE DURING DEBUGGING WILL BE LESS LIKELY TO
CRASH. ╒SING OTHER FLAGS ARE ALSO VALID -- THE USE OF WHICH FLAG (╔ PREFER
THE CARRY FLAG) IS USUALLY DEPENDENT ON THE PROGRAMMER. ╟EOS DEFINES A
SIMILAIR MACRO CALLED ┬╥┴ (BRANCH ALWAYS) WHICH IS EQUIVLENT TO:
CLV
BVC [LABEL]
╬OTE THAT THE ABOVE IS JUST PROGRAMMING STYLE, HELD OVER FROM MY PROGRAMMING
IN ASSEMBLY DAYS. ╘HE USE OF ╩═╨ IS PROBABLY PREFERABLE IN TERMS OF
EXECUTION AND ALSO IN BEING ABLE TO BRANCH MORE THAN 127 BYTES AWAY (THE
BRANCH INSTRUCTIONS ONLY HAVE A RANGE OF +128/-127).
╓╔. ├USTOM ├HARACTERS
-----------------
╙INCE WE'RE WRITING FOR EACH OF THE SEPERATE MODES (64 MODE, 128 MODE) WE HAVE
TO TAKE A LOOK AT THE DIFFERENCES BETWEEN THE ╓╔├ CHIP (64 MODE) AND THE 8563
CHIP IN THE 128.
╘HE ╓IC-├HIP
------------
╘HE CHARACTER SETS IN THE ╓╔├ CHIP ARE DEFINED AS IN THE EXAMPLE BELOW OF
THE CHARACTER CODE $00 "@" (ALL REFERENCES ARE TO SCREEN "POKE" CODES - NOT
PRINT CODES).
.BYT #%00111100 ╘RY HOLDING THE PAGE (OR MOVING AWAY FROM THE
.BYT #%01100110 SCREEN) AND TAKING A LOOK AT THE PATTERNS THE 1'S
.BYT #%01101110 AND 0'S MAKE. ┼ACH CHARACTER IS THUS DEFINED AS
.BYT #%01101110 EIGHT BYTES WHO'S BIT PATTERNS DEFINE IT. ╚AVING A
.BYT #%01100000 TOTAL OF 256 CHARACTERS AVAILABLE MAKES IT
.BYT #%01100010 NECCESARY TO SET ASIDE A TOTAL OF 2,048 BYTES.
.BYT #%00111100
.BYT #%00000000
╬OW, INSTEAD OF DESIGNING ALL 256 CHARACTER SETS WE'LL JUST TAKE ADVANTAGE OF
THE FACT THAT THE LETTERS AND NUMBERS WE WANT WILL ALREADY BE THERE -- WE'LL
JUST COPY THEM FROM THE ╥╧═ SET INTO ╥┴═, MODIFY SOME OF THE OTHER CHARACTERS
TO REFLECT WHAT WE WANT AND THEN TELL THE ╓╔├ CHIP TO LOOK AT ╥┴═ TO GET THE
CHARACTER SET DEFINITIONS.
╘HERE ARE SOME PROBLEMS WITH COPYING THE 'SYSTEM' CHARACTERS, HOWEVER. ╘HE
├OMMODORE 64 USUALLY MASKS OUT THE CHARACTER SET AND TYPICALLY IT IS ONLY
AVAILABLE TO THE ╓╔├ CHIP SO THAT MORE SPACE CAN BE PRESENT FOR USER PROGRAMS
AND SUCH. ╔T ALSO TAKES UP THE SECTION OF MEMORY THAT THE ╔/╧ BLOCK IN
$D000-$DFFF DOES SO THAT SWITCHING IT IN WHILE INTERRUPTS ARE ENABLED IS SURE
TO RESULT IN A CRASH.
╫E'RE ALSO GOING TO BE DOING A FEW THINGS THAT YOU MAY NOT EXPECT -- INSTEAD
OF COPYING ALL 256 CHARACTERS - WE'RE GONNA _JUST_ COPY THE FIRST 128. ╘HIS
WILL GIVE US ALL OF THE NORMAL CHARACTERS AS THE LAST 128 ARE THE REVERSE-
VIDEO COUNTERPARTS TO THE FIRST 128 CHARACTERS. ╫E'RE DOING THIS TO CONSERVE
SPACE AND BECAUSE WE REALLY DON'T NEED THAT MANY CHARACTERS DEFINED.
┴LSO LOCATION $01 CONTAINS WHAT $D000-$DFFF HOLDS AND WE WILL HAVE TO MODIFY
BIT 2 TO SWITCH THE CHARACTER ╥╧═ IN. ╚ENCE, THE FOLLOWING PROGRAM CODE IS
USED TO COPY THE CHARACTER SET:
-------------------------------------------------------------------------------
COPY'CHARS = * ; MUST BE RUN W/ INTERRUPTS DISABLED
LDA $01 ; REGISTER 1 = THE CONTROL TO SWITCH IN THE CHAR.
; ROM.
PHA ; SAVE IT AS WE'LL LATER NEED TO STA' IT BACK.
AND #%11111011 ; ┬IT 2 CONTROLS IT - CLEAR IT TO SWITCH IT IN.
STA $01 ; AND MAKE IT SO WE CAN READ IT IN.
LDA #>$3000 ; MOVE CHARS TO $3000
STA DEST+1
LDA #>$D800 ; FROM $D800 (START OF CHAR SET) (LOWER-CASE)
STA SRC+1
LDY #$00 ; LO-BYTES OF BOTH SRC, DEST = $00.
STY SRC
STY DEST
LDX #$10 ; COPY 2K OF DATA.
- LDA (SRC),Y ; COPY BYTE.
STA (DEST),Y
INY
BNE - ; CONTINUE UNTIL .┘ = 0.
INC SRC+1 ; INCREASE SOURCE & DEST BY 256
INC DEST+1
DEX ; DECREASE .╪ COUNT.
BNE - ; IF NON-ZERO THEN CONTINUE COPYING, ELSE
PLA ; RESTORE VALUE OF $01
STA $01 ; AND PUT BACK.
LDA $D018 ; SET ╓╔├-CHIP ADDRESS.
AND #$F1 ; TO SHOW CHAR SET.
ORA #$0C
STA $D018 ; AND FINALLY TELL ╓╔├ WHERE THE CHAR SET IS...
RTS ; AND RETURN.
-------------------------------------------------------------------------------
╬OTE THAT WE STILL NEED TO CHANGE THE ACTUAL CHARACTERS WE'RE GONNA BE USING.
╘HAT WILL BE HANDLED IN THE SECTION AFTER NEXT: ├HANGING THE ├HARACTERS AS
THERE IS A GREAT DEAL OF SIMILARITY BETWEEN THE 128 AND 64 IMPLEMENTATIONS.
╘HE 8563 ├HIP
-------------
╘HE 8563 80-├OLUMN CHIP USUALLY HAS 16K OR 64K ╥AM ATTATCHED TO THE CHIP
WHICH THE ├╨╒ DOES NOT HAVE DIRECT CONTROL OVER. ╔T HAS TO DIRECT THE 8563
TO STORE AND RETRIEVE VALUES TO THAT MEMORY. ╫HAT MAKES CONTROL OVER THAT
MEMORY ALL THE MORE DIFFICULT IS THE FACT THAT THE 8563 ONLY HAS TWO LINES
OR ADDRESSES THAT THE ├╨╒ CAN CONTROL.
╘HE 8563 HAS A CHARACTER SET IN MUCH THE SAME WAY THE ╓╔├ CHIP DOES, SAVE
ONE EXCEPTION - EACH CHARACTER SET CAN HAVE UP TO 16 LINES. ╬ORMALLY, THE LAST
EIGHT LINES ARE FILLED WITH $00 AND ARE NOT SHOWN. (╨ROVISIONS CAN BE MADE TO
HAVE 8X16 CHARACTERS BUT IT IS NOT NEEDED FOR THIS GAME AND THUS, WILL NOT BE
SHOWN - ╞OR MORE INFORMATION ╙EE ├= ╚ACKING ╔SSUE #2: 8563: ┴N ╔N-─EPTH ╠OOK.)
╘HUS THE ALGORITHIM IS SIMILAIR TO THE ├=64 BUT 8 ZERO-BYTES WILL NEED TO BE
WRITTEN AT THE END OF EVERY EIGHT BYTES READ.
╚OWEVER, THE 8563 DOES MAKE THINGS EASIER FOR US! - ╫HEN THE COMPUTER IS FIRST
TURNED ON A COPY OF THE ├HARACTER ╙ET FROM ╥╧═ IS COPIED INTO THE 8563. ╘HE
8563 HAS NO ╥╧═ ├HARACTER ╙ET ASSOCIATED WITH IT AND THUS WE ARE ABLE TO JUST
SIMPLY MODIFY THE CHARACTER SET THAT IS IN THE 8563 MEMORY INSTEAD OF COPYING
IT OVER. ┬ECAUSE OF THIS NO ROUTINE WILL BE PRESENTED TO COPY A CHARACTER
SET INTO THE 8563 MEMORY, RATHER THE DISCUSSION OF COPYING INDIVIDUALLY
DEFINED CHARACTERS WILL TAKE PLACE IN THE NEXT SECTION. ╘HE ├=128 ALSO MAKES
LIFE EVEN EASIER FOR US AT THE END WHEN WE WILL EXIT THE PROGRAM,
MODIFYING THE CHARACTER SET BACK TO THE "STANDARD" ├OMMODORE CHARACTER SET
BY A ROUTINE IN THE ╦┼╥╬┴╠ THAT WILL COPY THE CHARACTERS BACK. ╫E'LL TAKE A
LOOK AT IT CLOSER WHEN WE WRITE THE EXIT ROUTINE.
┴LSO NOTE THAT SINCE THE 8563 CHIP SUPPORTS THE 80 COLUMN SCREEN WE WILL
BE DEFINING TWO CHARACTERS THAT CAN BE PLACED SIDE BY SIDE FOR EACH ALIEN
SO THAT THE PLAYING FIELD WILL BE SIMILAIR TO THE ├64 VERSION. ╚OWEVER, FOR
THE TITLE SCREEN WE WILL BE SWITCHING THE 8563 INTO A "40 COLUMN" MODE
TO MAKE PROGRAMMING EASIER, IN ADDITION TO EXPANDING THE CHARACTER BIT-MAPPED
LOGO.
├HANGING THE ├HARACTERS
-----------------------
┴ LOT OF THE TIMES YOU'LL FIND YOURSELF RE-USING SUBROUTINES AND CODE THAT
YOU HAVE PREVIOUSLY CREATED, GRADUALLY, OVER A PERIOD OF TIME BUILDING UP
A LIBRARY OF ROUTINES. ╫HEN THINKING THROUGH THE PURPOSE AND INTENT OF THIS
ROUTINE ╔ THOUGHT ABOUT POSSIBLY BUILDING IT SO IT WOULD READ A TABLE AND
CHANGE THE CHARACTER SET BASED ON THAT TABLE. ╘HE 64/128 CHARACTER SETS
WOULD BE THE SAME - THIS ROUTINE WOULD AUTOMATICALLY GENERATE THE EIGHT
ADDITIONAL BYTES NEEDED BY THE 8563 IF NEED-BE AND IT WOULD CALL THE
APPROPRIATE STORAGE ROUTINE - STORE TO EITHER THE 8563 OR THE COMPUTER
MEMORY.
╬OW YOU MAY BE ASKING WHY WOULD YOU WANT TO STORE TO THE COMPUTER MEMORY
IN 128 MODE? ╫HY NOT JUST HAVE TWO SEPERATE VERSIONS? - ┘ES - THAT COULD
BE POSSIBLE BUT ╔'M IMPLEMENTING IT THIS WAY BECAUSE IN THE FUTURE ╔ MAY
SEE A NEED TO DEFINE CUSTOM CHARACTERS IN 128 MODE FOR THE 40 COLUMN SCREEN.
╘HIS WAY ╔ CAN JUST EXTRACT THE ROUTINE, POP IT INTO MY PROGRAM AND ╔'VE GOT
THAT SECTION OF THE CODE COMPLETE.
╘HIS IS WHAT ╔ WAS THINKING OF FOR THE DATA TABLE:
.BYT 1 = 8563, 0 = COMP. MEMORY.
.WORD ADDRESS ; ADDRESS BASE OF CHAR-SET IN COMPUTER OR 8563 MEMORY.
.BYTE CHAR # ; (TO START)
.BYTE # OF CHARS TO DEFINE
.BYTE # OF CHARACTERS TO DEFINE
.BYTE DATA,DATA,....,DATA8 ; CHARACTER DATA.
.BYTE DATA,DATA,....,DATA8 ; CHARACTER DATA. ETC....
. . .
┼NTRANCE INTO THE ROUTINE WILL CONSIST OF .┴┘ HOLDING THE LOCATION OF THE
TABLE. ╫E WILL KEEP THE ADDRESS OF THE TABLE AND KEEP INCREMENTING IT AS
WE GO ALONG IN Z-PAGE LOCATIONS.
-------------------------------------------------------------------------------
INSTALL'CHAR = *
STA ZP1 ; SAVE .AY IN TABLE ADDRESS
STY ZP1+1
LDY #$00 ; READ COMPUTER MODE.
JSR GET'BYTE
STA MODE
JSR GET'BYTE ; GET ADDRESS BASE.
STA ADR
JSR GET'BYTE
STA ADR+1
JSR GET'BYTE ; GET NUMBER OF CHARACTERS TO COPY.
STA NUMB
JSR GET'BYTE ; GET NEXT CHARACTER #.
STA WRK ; SAVE IN TEMP. LOCATION.
LDA #$00
STA WRK+1
ASL WRK ; SHIFT LEFT X3 TIMES = *8
ROL WRK+1
ASL WRK
ROL WRK+1
ASL WRK
ROL WRK+1
LDA MODE ; IF FOR 8563 THEN MULTIPLY 1 MORE TIME.
BEQ +
ASL WRK
ROL WRK+1
+ LDA ADR ; ADD CHARACTER ADDRESS IN.
CLC
ADC WRK
STA WRK
LDA ADR+1
ADC WRK+1
STA WRK+1 ; ADDRESS NOW CALCULATED
JSR SETADRS ; SET ADDRESS IN PROPER CHIP
LOOP'INSTALL LDX #$08 ; COPY 8 BYTES.
- JSR GET'BYTE
JSR WRITEBYTE ; WRITE OUT BYTE.
DEX
BNE -
LDA MODE ; IF 128 THEN FILL OUT 8 MORE $00 BYTES.
BEQ +
LDA #$00
LDX #$08
- JSR WRITEBYTE
DEX
BNE -
+ DEC NUMB
BNE LOOP'INSTALL
RTS
-------------------------------------------------------------------------------
╫HAT? ╫E HAVE THRE SUBROUTINES : WRITEBYTE, SETADRS, AND GET'BYTE THAT WE
HAVEN'T EXAMINED YET. ╘HESE ARE GOING TO BE THE ROUTINES THAT ARE DEPENDANT
ON THE COMPUTER TYPE. ┴LSO, WRITEBYTE WILL REQUIRE THAT .╪┘ NOT BE DISTURBED;
SETADRS REQUIRES THAT .┘ NOT BE DISTURBED HENCE THE FOLLOWING:
-------------------------------------------------------------------------------
SETADRS TYA ; SAVE .YX
PHA
TXA
PHA
LDA MODE ; CHECK COMPUTER TYPE.
BEQ + ; IF ├=64, THEN JUMP AHEAD.
LDX #18 ; ╓─├ REGISTER - CURRENT MEMORY ADDRESS HI
LDA WRK+1 ; GET ADDRESS HI
JSR WR'VDC
LDX #19 ; ╓─├ REGISTER - CURRENT MEMORY ADDRESS LO
LDA WRK ; GET ADDRESS LO
JSR WR'VDC
+ PLA ; RESTORE .╪┘
TAX
PLA
TAY
RTS ; AND RETURN.
-------------------------------------------------------------------------------
╬OTE THAT WE REALLY DON'T NEED A SETADRS FOR THE ├=64 -- WE CAN JUST INDEX
OFF (WRK) IN THE WRITEBYTE ROUTINE WHICH FOLLOWS:
-------------------------------------------------------------------------------
WRITEBYTE STA TEMP ; SAVE AS WE NEED IT LATER.
TXA ; ╙AVE .╪┘
PHA
TYA
PHA
LDA MODE ; NOW CHECK COMPUTER TYPE.
BEQ + ; IF C64 JUMP AHEAD
LDA TEMP ; RECALL TEMP.
JSR WR'VRAM
SEC
BCS ++ ; JUMP AHEAD
+ LDY #$00 ; ├64 / Y-INDEX = $00
LDA TEMP ; GET VALUE
STA (WRK),Y ; STORE
INC WRK ; NOW INCREASE ADDRESS
BNE +
INC WRK+1
+ PLA ; NOW RETURN AFTER RECALLING .╪┘
TAY
PLA
TAX
RTS ; AND RETURN.
-------------------------------------------------------------------------------
╬OTE THAT THE FOLLOWING ROUTINE IS FAIRLY SHORT BUT IT IS CALLED NUMEROUS
TIMES WITHIN THE ROUTINES THAT USE DATA TABLES SUCH AS INSTALL'CHAR,
WRITE'TXT AND WRITE'COL.
-------------------------------------------------------------------------------
GET'BYTE = *
LDA (ZP1),Y
INY
BNE + ; IF ZERO THEN INCREASE ZP1 HI
INC ZP1+1
+ RTS
-------------------------------------------------------------------------------
╬OT BAD 'EH? ┴ QUICK NOTE: ╘HE INSTRUCTIONS: ╨╠┴, ╘┴┘, ╨╠┴, ╘┴╪, ╨╚┴, ETC..
ARE ROUTINES THAT ╨USH OR ╨ULL (PHA,PLA) THE .┴ ONTO THE STACK. ╘HE ╘┴┘, ╘┴╪,
╘╪┴, ╘┘┴ ARE INSTRUCTIONS THAT TRANSFER A REGISTER TO ANOTHER (IE: THE ╘┴┘
TRANSFERS THE ┴ REGISTER TO .┘, ╘╪┴ TRANSFERS .╪ TO .┴ ETC...) ┬Y USING THE
COMBINATION OF THESE WITH THE STACK WE CAN SAVE THE REGISTERS AND LATER
RE-CALL THEM SO THAT THEY ARE THE SAME WHEN WE ENTERED THE ROUTINE. ╘HE
STACK IS USUALLY A "MYSTERY" ITEM TO NEW PROGRAMMERS OF THE 6502 SERIES.
┬ASICALLY IT'S JUST LIKE ANY OTHER STACKS IN THE REAL WORLD - THE LAST ITEM
THROWN (╔'M NON-PRACTICING PERFECTIONIST SO ╔ THROW STUFF.. ;-) ) OR PUSHED
ON THE STACK WILL THE FIRST ITEM REMOVED OR PULLED FROM THE STACK. ╞OR
EXAMPLE ╔'VE GOT A STACK OF BOOKS SITTING NEAR ME :
═APPING THE ├OMMODORE 128
128 ╔NTERNALS
AND ╔'M HOLDING ═APPING THE ├OMMODORE 64 IN MY HANDS. ╔F ╔ PUSH (OR TOSS)
THE BOOK ONTO THE STACK (AND HOPEFULLY HIT THE STACK INSTEAD OF THE FLOOR)
╔'LL HAVE THE FOLLOWING STACK:
═APPING THE ├OMMODORE 64
═APPING THE ├OMMODORE 128
128 ╔NTERNALS
AND IT SHOULD BE EASY TO SEE THAT IF ╔ "PULL" THE NEXT BOOK OFF THE STACK
THAT ╔'LL GET THE ═APPING THE ├OMMODORE 64 BOOK. ╘HE NEXT BOOK TO BE "PULL"ED
AFTER THAT WOULD BE THE ═APPING THE ├OMMODORE 128 BOOK. ╘HIS IDEA CAN BE
APPLIED TO THE 6502 STACK -- ╔T WILL KEEP STORING VALUES (UP TO 256) WHEN YOU
"PUSH" THEM ON (VIA THE ╨╚┴ INSTRUCTION) AND WILL RETRIEVE THE LAST VALUE
STORED WHEN YOU "PULL" THEM OFF (VIA THE ╨╠┴ INSTRUCTION). ┴NOTHER ╨╠┴
INSTRUCTION WOULD RETURN THE NEXT VALUE THAT HAD BEEN STORED.
╘HE ├HARACTER ┬ITMAPS
---------------------
╨ASI ╧JALA IS TO BE CREDITED WITH ALL THE GRAPHICS AND MANY THANKS GO OUT
TO HIM.
╘HE GAME LOGO IS MADE UP OF 120 CUSTOM DEFINED CHARACTERS THAT WILL BE
PRINTED IN THE FOLLOWING MANNER (ON THE 128 SCREEN THEY WILL BE CENTERED).
(IN REVERSE VIDEO)...
┴┬├─┼╞╟╚ . . . [UP TO 40 CHARACTERS]
╔╩╦╠═╬╧╨
╤╥╙╘╒╓╫╪
AND EVERYTHING WILL LINE UP.
╙O THAT IT WILL LOOK LIKE A "MINI-BITMAP". ╫E COULD HAVE USED BITMAP MODE
AND MADE A VERY NICE LOOKING TITLE SCREEN BUT THAT WOULD HAVE INVOLVED
SWITCHING AND ALLOCATING MEMORY FOR THE BITMAP, ETC . . . ╧N BOTH THE
8563 AND THE ╓╔├ THAT INVOLVES A BIT MORE WORK AND SO CUSTOM CHARACTERS
WILL BE USED FOR THE TITLE SCREEN. ╘HE REGULAR LETTER AND NUMERIC CHARACTERS
WILL BE AVAILABLE SO THAT WE CAN DISPLAY CREDITS AND GAME INSTRUCTIONS
BELOW THE LOGO.
╬OW - IN THE PROGRAM LISTING WE COULD LIST THEM AS BINARY #'S AND THAT WOULD
MAKE EDITING THEM VERY EASY BUT WE'RE GONNA USE THEIR DECIMAL REPRESENTATION
IN THE PROGRAM LISTING.
╘HE CHARACTERS ARE DEFINED SIMILAIR TO THE LOGO EXCEPT THEY ARE TREATED AS
SINGLE CHARACTERS. ╔N THE 128 VERSION DUE TO THE 80 COLUMN SCREEN WE ARE
GOING TO USE TWO CHARACTERS SIDE BY SIDE TO SIMULATE ONE ALIEN SO THAT THE
PLAYING FIELD WILL BE SIMILAIR TO THE ├64 VERSION. ╔N ADDATION, DURING THE
MAIN LOOP WE WILL MODIFY THE CHARACTER SETS TO SUPPORT ANIMATION OF THE
ALIENS. ╔N THE DATA LISTING THERE IS A REFERENCE TO "FRAMES" - FOR EACH OF
THE ALIENS THERE ARE 8 DIFFERANT FRAMES.
╧H! - ╘HERE WILL BE MORE CHARACTERS DEFINED IN THE FUTURE. ╥IGHT NOW ╔'M
MAINLY INTERESTED IN GETTING SOME BASE CHARACTERS DOWN SO YOU CAN SEE HOW
CUSTOM CHARACTERS ARE IMPLEMENTED. ╫HEN WE START SETTING UP DIFFERENT LEVELS
AND SUCH WE'LL ADD MORE CHARACTERS THEN. ├URRENTLY THE CUSTOM CHARACTERS
ARE NOT USED - ONLY THE CHARACTERS FOR THE LOGO. ╞OR THOSE OF YOU WHO ARE
CURIOUS TRY INSTALLING THE CHARACTERS VIA INSTALL'CHAR AND TAKING A LOOK
AT THE ALIENS.
╓╔╔. ╘ITLE ╙CREEN
------------
╘HE TITLE SCREEN IS USUALLY A LEAD-IN TO THE ACTUAL GAME AND IT'S AIM IS
TO TELL THE PLAYER HOW TO PLAY THE GAME, ANY AVAILABLE OPTIONS AND P'HAPS
PRESENT A NICE GRAPHIC OR TWO TO "WOW" THE USER INTO PLAYING. ╔N ADDATION,
THE MAIN MUSICAL THEME CAN BE INTRODUCED HERE TO UNIFY THE GAME-PLAYING.
╘HE DISCUSSION BELOW DOES NOT TAKE INTO ACCOUNT COLOR BUT REST-ASSURED WE
WILL BE USING VARYING COLORS IN THE TITLE SCREEN. ╘HE FORMAT FOR THE COLOR
DATA WILL BE ALMOST IDENTICAL TO THE TITLE SCREEN FORMAT EXCEPT IT WILL
BE STRUCTURED VIA THE FOLLOWING:
.WORD ADDRESS
.BYTE NUM_OF_CHARS TO PUT COLOR ($00= END OF DATA)
.BYTE COLOR_VALUE
╘HE ROUTINE (COLOR'TEXT) CAN BE FOUND IN THE SOURCE LISTINGS AT THE END OF
THIS ARTICLE. ┬ECAUSE OF THE SIMILARITY BETWEEN IT AND WRITE'TEXT IT IS
NOT DISCUSSED IN THIS ARTICLE.
╘ITLE ╙CREEN ┬ACK╟ROUND
-----------------------
╘HE TITLE SCREEN ╔ ENVISONED AS A BORDERED SCREEN (USING THE NORMAL ├=
CHARACTER SET - IE: ├= ┴,╙,┌,╪ ON THE KEYBOARD) WITH OUR BITMAP IN THE MIDDLE
AND UNDER-NEATH IT A SHORT DESCRIPTION OF THE GAME AND GAME-PLAY INSTRUCTIONS.
╬OW THIS IS MY IDEA OF THE SCREEN LAYOUT (ROUGH DRAWING AS WE'RE NOT USING
THE ACTUAL SCREEN DIMENSIONS):
+-------------------------------------------------------------+
ⁿ -╠╧╟╧ ----------------------------------------------------- ⁿ
ⁿ --------------X 3 LINES------------------------------------ ⁿ
ⁿ ----------------------------------------------------------- ⁿ
ⁿ ⁿ
ⁿ ╙PACE ╔NVASION ├64/128 ⁿ
ⁿ ╨ROGRAMMING : ├RAIG ╘AYLOR ⁿ
ⁿ ╟RAPHICS : ╨ASI ╧JALA ⁿ
ⁿ ╙OUND : ???????????? ⁿ
ⁿ ⁿ
ⁿ ----------------------------------------------------------- ⁿ
--
- ├RAIG ╘AYLOR ⁿⁿ ╙TANDARD ─ISCLAIMER ┴PPLIES (OF COURSE!)
DUCK@PEMBVAX1.PEMBROKE.EDU (╨EMBROKE ╙TATE ╒NIVERSITY)
╧REGON, N.:
┼IGHTY BILLION GALLONS OF WATER WITH NO PLACE TO GO ON ╙ATURDAY
NIGHT.
┼ND OF ╞ILE, ╨RESS ╥┼╘╒╥╬ TO QUIT
┴RTICLE #10122 (10178 IS LAST):
╞ROM: DUCK@PEMBVAX1.PEMBROKE.EDU
╬EWSGROUPS: COMP.SYS.CBM
╙UBJECT: ├= ╚ACKING ╔SSUE #4 2/5
─ATE: ═ON ╧CT 5 10:00:55 1992
ⁿ ╘O ╨LAY: ⁿ
ⁿ ╒SE JOYSTICK IN PORT 2, MOUSE IN PORT 1 OR KEYBOARD: ⁿ
ⁿ ┴ - ╠EFT, ┌ - ╥IGHT ╙PACE - ╞IRE ⁿ
ⁿ ╞1 - ╥ESTART ⁿ
ⁿ ⁿ
+-------------------------------------------------------------+
╘ITLE ╙CREEN ╞ORMATTING
-----------------------
╫E COME INTO A PROBLEM HERE -- THE SCREEN IS SOME 1000 CHARACTERS ON THE ├64,
AND 2000 CHARACTERS FOR THE ├=128. ╔T WOULD BE EXTREMELY WASTEFUL TO STORE
THAT MANY CHARACTERS IN MEMORY JUST TO REPRODUCE A TITLE SCREEN - AND MOST OF
THEM CONSISTING OF SPACES AT THAT!!
╫HAT WE'LL DO IS TO JUST SPECIFY THE ADDRESS ON SCREEN, THE # OF CHARACTERS
AND THEN LIST THE CHARACTERS. ╔T WILL BE SIMILAIR TO OUR CUSTOM CHARACTER
TABLE DRIVER ABOVE BUT WILL BE DIFFERENT ENOUGH THAT A NEW ROUTINE IS
WARRENTED. ╫E WILL HOWEVER USE THE TWO SUBROUTINES WRITEBYTE AND SETADRS
THAT WERE DEVELOPED IN THE PREVIOUS ROUTINE. ╘HE DATA WILL LOOK LIKE THE
FOLLOWING:
.WORD ADDRESS
.BYTE NUM_OF_CHARS ($00= END OF DATA)
.ASCII "TEXT"
.BYTE ADDRESS .... ETC....
AND WE'LL ENTER WITH .┴┘ CONTAINING THE ADDRESS OF THE TABLE.
╙O BASICALLY WE COME UP WITH THE FOLLOWING:
-------------------------------------------------------------------------------
WRITE'TXT = *
STA ZP1 ; SAVE .AY IN TABLE ADDRESS
STY ZP1+1
LDY #$00
LOOP'W'TEXT = *
JSR GET'BYTE ; SET ADDRESS.
STA WRK
JSR GET'BYTE
STA WRK+1
JSR GET'BYTE ; GET # OF CHARS TO WRITE OUT.
CMP #$00
BEQ + ; IF ZERO THEN EXIT.
TAX
JSR SETADRS ; SET ADDRESS TO WRK,WRK+1
- JSR GET'BYTE
JSR WRITEBYTE ; WRITE OUT BYTE.
DEX
BNE -
SEC
BCS LOOP'W'TEXT ; THIS IS AN ABSOLUTE JUMP TO LOOP
+ RTS ; RETURN.
-------------------------------------------------------------------------------
╘HIS IS SIMILAIR TO OUR PREVIOUS ROUTINE, AND WAS IN FACT COPIED AND MODIFIED
FROM THE PREVIOUS ROUTINE.
╓╔╔╔. ─EBUGGING
---------
╬OW, NOT ALL PROGRAMS ARE PERFECT, AND DURING THE DEVELOPMENT OF THIS
PORTION OF THE GAME THERE WERE SEVERAL ERRORS FOUND. ╘RACING AN ERROR IN
═ACHINE/┴SSEMBLY-╠ANGUAGE IS LIKE TRYING TO FIND A GRAMMATICAL ERROR IN A
LANGUAGE YOU DON'T KNOW. ;-) ┬UT SERIOUSLY, THERE ARE SEVERAL WAYS TO TRACK
DOWN ERRORS IN YOUR CODE.
1 - ╘RY TRACING IT THROUGH BY HAND PLAYING "╫HAT IF ╔ WERE THE COMPUTER" AND
FOLLOWING WHAT EACH REGISTER DOES.
2 - ┴RE YOU SWITCHING THE ╠O╚I ORDER OF VARIABLES? ╔E: IS IT LDA #< OR
LDA #>??
3 - ╙ET ┬╥╦ POINTS AND RUN THE PROGRAM / SUBROUTINE WITHIN A MACHINE LANGUAGE
MONITOR AND MAKE SURE THE REGISTERS / MEMORY LOCATIONS CONTAIN THE VALUES
THAT THEY SHOULD. ╔F NOT, FIND OUT WHY.
4 - ╘RY TO SIMPLIFY YOUR CODE IN TERMS OF PROGRAMMING EASE - ═AKE THE
ASSEMBLER DO THE WORK FOR YOU - IT'S A LOT LESS LIKELY TO MAKE ERRORS
THAN YOU ARE.
5 - ╘HINK LOGICALLY!!!
6 - ├HANGE SOMETHING AT RANDOM AND PRAY.
╔ CAN'T STRESS NUMBERS 3 AND 5 ENOUGH. ─URING THE WRITING OF THE INSTALL'CHAR
ROUTINE THERE WERE NUMEROUS BUGS THAT WERE EVENTUALLY TRACKED DOWN BY
SETTING A ┬╥╦ INSTRUCTION FURTHER ALONG IN THE CODE AND SEEING EXACTLY WHAT
THE REGISTER / MEMORY LOCATIONS WERE. ┴LSO THE USE OF TEMPORARY LOAD AND
STORE INSTRUCTIONS INTO "SAFE" REGIONS OF MEMORY HELPED ME MONITOR WHAT SOME
OF THE VALUES WERE.
╞OR EXAMPLE, AT ONE POINT ╔ HAD A SECTION OF CODE SIMILAIR TO THE FOLLOWING:
CLC
LDA VALUE
ADC DATA
BNE +
INC DATA+1
+ [.... ]
┴ND IT'S PURPOSE WAS TO ADD VALUE TO DATA. ╬OW ╔'VE FOUND SIMPLE ERRORS ARE
USUALLY FOUND LAST, AFTER COMPLEX ERRORS. ┴ND NOT UNTIL A SET A BREAK POINT
LIKE:
CLC
LDA VALUE
ADC DATA <-----═ISSING ╔NSTRUCTION AFTER HERE-------------+
BNE + ⁿ
INC DATA+1 ⁿ
+ ┬╥╦ ⁿ
[.... ] ⁿ
ⁿ
DID ╔ ACTUALLY FIGURE OUT THAT ╔ WAS MISSING THE ╙╘┴ ─┴╘┴ INSTRUCTION --+
╙O, WHEN WRITING, MODIFYING, AND TRYING TO DEBUG CODE TRY TO TAKE YOUR TIME
AND ISOLATE EVERY POSSIBLE PROBLEM. ┴LSO DON'T BE AFRAID TO STOP THE CODE
MID-STREAM AS IN THE ABOVE WITH USE OF THE ┬╥╦. ┘OU CAN ALWAYS REMOVE IT
(AND PROBAHLY SHOULD) IN THE FINAL CODE AND IT SERVES AS A VERY VALUABLE
DEBUGGING TOOL WITH THE AID OF A MACHINE-LANGUAGE MONITOR.
╔╪. ═EMORY ═AP ├ONSIDERATIONS
-------------------------
┬EFORE YOU START A PROGRAM IT'S A GOOD IDEA TO CONSIDER WHERE IN MEMORY YOU
WILL HAVE EVERYTHING. ╬OW WE'VE ALREADY STARTED SOME OF THE PROGRAM ABOVE
AND JUST BLINDLY PICKED NUMBERS AT RANDOM IT SEEMED LIKE $3000 FOR THE
CHARACTER SET FOR THE ├=64 ETC... ╫E DIDN'T - ╔'M INTRODUCING THE ═EMORY
═AP ├ONSIDERATIONS HERE TO SHOW THE EXAMPLE OF WHAT IF WE DIDN'T THINK
ABOUT HOW MEMORY WAS GOING TO BE ORGANIZED.
╘HE ├=64 ONLY HAS 64K OF MEMORY OF WHICH TYPICALLY THE RANGE $0800-$A000
IS AVAILABLE AND $C000-$CFFF IS ALSO. ╔F WE HAD BLINDLY PICKED NUMBERS
ALL OVER THE PLACE TO STORE OUR CODE THEN WE WOULD HAVE A DISORGANIZED
PROGRAM THAT WOULD MOST LIKELY ACCIDENTALLY USE ONE SUBROUTINES STORAGE
AS TEMPORARY DATA FOR ANOTHER. ╔T'S LIKE SHOOTING RANDOMLY IN ╠ASER ╘AG
NOT CHECKING TO SEE IF THERE IS A TARGET THERE OR NOT FIRST... ╘HE END
RESULT: ├HAOS.
├URRENTLY WE'RE NOT FOLLOWING THE RULE FOR "TEMPORARY VARIABLES" BUT AS
WE GRADUALLY FADE OUT OF THE NORMAL ├-64/128 DEFAULT MODE AND WRITE OUR
OWN ROUTINES / INTERRUPT HANDLERS WE'LL SWITCH THINGS OVER. ┴LSO, ON THE
├=128 INSTEAD OF USING ┬ANK 0 WITH THE ╔/╧ BLOCK ENABLED WE'RE CURRENTLY
USING THE ┬┴╬╦ 15 CONFIGURATION AS THE PROGRAM DOESN'T EXTEND PAST $4000
YET ($0000-$4000 IS COMMON MEMORY IN THE NORMAL ├=128 CONFIGUARTION).